home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / romize.zip / INSJUMP.C < prev    next >
Text File  |  1989-01-28  |  2KB  |  90 lines

  1. /* INSJUMP.C Program to put the restart jump
  2.   and a checksum  in the ROM   */
  3.  
  4. #include <stdio.h>
  5. #include <mem.h>
  6. #include <fcntl.h>
  7. #include <string.h>
  8.  
  9.   typedef unsigned char byte;
  10.  
  11.   byte  Jump[] = "\xEA\0\0\0\xF8";    /* JMP FAR F800:0  for 32K */
  12.  
  13.   byte  IOBuffer[4096];
  14.  
  15.   int       BinFileIn;
  16.   int       BinFileOut;
  17.  
  18.   unsigned  Actual;
  19.   unsigned  i;
  20.   unsigned  long total_bytes;
  21.   unsigned  long rom_size;
  22.   int       bytes_read;
  23.   unsigned  cksum;
  24.  
  25. void main(int argc, char *argv[])
  26. {
  27.  
  28.   if (argc < 2) {
  29.     printf("Usage: INSJUMP filename [64K]\n");
  30.     exit(1);
  31.   }
  32.   if (!stricmp(argv[2],"64K")) {
  33.     rom_size = 65536;
  34.     printf("Processing a 64K ROM\n");
  35.     Jump[4] = 0xF0;    /* change jump offset for 64K */
  36.   }
  37.   else {
  38.     rom_size = 32768;
  39.     printf("Processing a 32K ROM\n");
  40.   }
  41.  
  42.   if((BinFileIn = open(argv[1],O_BINARY | O_RDONLY)) < 0) {
  43.     printf("Couldn't open %s \n",argv[1]);
  44.     exit(1);
  45.   }
  46.  
  47.   if((BinFileOut = _creat("TEMP.BIN",0)) < 0 ) {
  48.     printf("Couldn't open temp file for rewriting\n",argv[1]);
  49.     exit(1);
  50.   }
  51.  
  52.   total_bytes = 0;
  53.   cksum = 0;
  54.  
  55.   do {
  56.     if (!eof(BinFileIn)) {
  57.       bytes_read = read(BinFileIn,IOBuffer,sizeof(IOBuffer));
  58.       /* printf("%d  bytes read\n",bytes_read); */
  59.     }
  60.     else bytes_read = 0;
  61.  
  62.     if (bytes_read != sizeof(IOBuffer))  /* fill unused with FF's  */
  63.       memset(&IOBuffer[bytes_read],0xFF,sizeof(IOBuffer)-bytes_read);
  64.  
  65.     total_bytes += sizeof(IOBuffer);
  66.     if (total_bytes == rom_size) {  /* last block -- put jump and cksum */
  67.       memcpy(&IOBuffer[sizeof(IOBuffer)-16],&Jump[0],5);  /* put in the jump */
  68.       for (i = 0; i < sizeof(IOBuffer)-2; i += 2)  /* cksum all but last word */
  69.         cksum += cksum + (unsigned) IOBuffer[i];
  70.       cksum -= 0x10000;
  71.       IOBuffer[sizeof(IOBuffer)-2] = cksum & 0xFF;
  72.       IOBuffer[sizeof(IOBuffer)-1] = cksum >> 8;
  73.     }
  74.     else {
  75.       for (i = 0; i < sizeof(IOBuffer); i += 2)
  76.         cksum += cksum + (unsigned) IOBuffer[i];
  77.     }
  78.     write(BinFileOut,IOBuffer,sizeof(IOBuffer));
  79.   } while (total_bytes != rom_size);
  80.  
  81.   close(BinFileIn);
  82.   close(BinFileOut);
  83.  
  84.   unlink(argv[1]);
  85.   rename("TEMP.BIN",argv[1]);
  86.  
  87.  
  88. }
  89.  
  90.